﻿/*  Eleven Business Suite : Un ERP básico para pequeños empresarios.
 *  Copyright (C) 2011  Francis Bolaños Arias
 *
 *  This program is free software: you can redistribute it and/or modify
 *  it under the terms of the GNU General Public License as published by
 *  the Free Software Foundation, either version 2 of the License, or
 *  (at your option) any later version.
 *
 *  This program is distributed in the hope that it will be useful,
 *  but WITHOUT ANY WARRANTY; without even the implied warranty of
 *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
 *  GNU General Public License for more details.
 *
 *  You should have received a copy of the GNU General Public License
 *  along with this program.  If not, see <http://www.gnu.org/licenses/>;.
 */

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using ElevenCore;
using ElevenGlobal;

namespace ElevenGUI
{
    public partial class FrmPerdidas : Form
    {

        private DataTable dtPerdidas;

        private GLOBuscador buscador;

        public FrmPerdidas()
        {
            InitializeComponent();
        }

        private void btnNuevo_Click(object sender, EventArgs e)
        {
            btnBuscarProd.Enabled = true;
            dtpFecha2.Enabled = false;
            lstPerdidas.Enabled = false;
            dtpFecha.Enabled = true;
            txtCant.ReadOnly = false;
            txtMotivo.ReadOnly = false;
            btnNuevo.Enabled = false;
            btnGuardar.Enabled = true;
            btnEliminar.Enabled = false;
            btnCancelar.Enabled = true;
        }

        private void btnCancelar_Click(object sender, EventArgs e)
        {
            btnBuscarProd.Enabled = false;
            dtpFecha2.Enabled = true;
            lstPerdidas.Enabled = true;
            dtpFecha.Enabled = false;
            txtCant.ReadOnly = true;
            txtMotivo.ReadOnly = true;
            btnNuevo.Enabled = true;
            btnGuardar.Enabled = false;
            btnEliminar.Enabled = true;
            btnCancelar.Enabled = false;
        }

        private void FrmPerdidas_Load(object sender, EventArgs e)
        {
            cargarListaPerdidas();
        }

        private void cargarListaPerdidas()
        {
            try
            {
                dtPerdidas = SCMPerdida.consultar(dtpFecha2.Value);
                lstPerdidas.DataSource = dtPerdidas;
                lstPerdidas.DisplayMember = "Fecha";
                lstPerdidas.ValueMember = "IdPerdida";
            }
            catch (FormatException) { }
            catch (NullReferenceException) { }
        }

        private void cargarDetallesPerdida()
        {
            try
            {
                txtCant.ForeColor = Color.Black;
                DataTable dt = SCMPerdida.consultarPrecioCostoMAX(int.Parse(txtID.Text));
                DataRow dr = dt.Rows[0];
                double PrecioUnitario = double.Parse(dr["PrecioUnitario"].ToString());
                txtPrecioUnitario.Text = Convert.ToString(PrecioUnitario);
                txtTotalPerdido.Text = Convert.ToString(PrecioUnitario * int.Parse(txtCant.Text));
            }
            catch (FormatException)
            {
                txtCant.ForeColor = Color.Red;
            }
            catch (IndexOutOfRangeException){
                txtPrecioUnitario.Text = "0";
                txtTotalPerdido.Text = "0";
            }
        }

        private void cargarDatosPerdida()
        {
            try
            {
                txtID.Text = dtPerdidas.Rows[int.Parse(lstPerdidas.SelectedIndex.ToString())]["IdProducto"].ToString();
                txtProducto.Text = dtPerdidas.Rows[int.Parse(lstPerdidas.SelectedIndex.ToString())]["Nombre"].ToString();
                txtMotivo.Text = dtPerdidas.Rows[int.Parse(lstPerdidas.SelectedIndex.ToString())]["Motivo"].ToString();
                txtCant.Text = dtPerdidas.Rows[int.Parse(lstPerdidas.SelectedIndex.ToString())]["Cantidad"].ToString();
                DataTable dt = SCMPerdida.consultarPrecioCostoMAX(int.Parse(dtPerdidas.Rows[
                    int.Parse(lstPerdidas.SelectedIndex.ToString())]["IdProducto"].ToString()));
                DataRow dr = dt.Rows[0];
                double PrecioUnitario = double.Parse(dr["PrecioUnitario"].ToString());
                txtPrecioUnitario.Text = Convert.ToString(PrecioUnitario);
                txtTotalPerdido.Text = Convert.ToString(PrecioUnitario * int.Parse(txtCant.Text));
            }
            catch (IndexOutOfRangeException) {
                txtPrecioUnitario.Text = "0";
                txtTotalPerdido.Text = "0";
            }
        }

        private void cbProducto_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarDetallesPerdida();
        }

        private void mcPerdidas_DateChanged(object sender, DateRangeEventArgs e)
        {
            
        }

        private void txtCant_TextChanged(object sender, EventArgs e)
        {
            cargarDetallesPerdida();
        }

        private void btnGuardar_Click(object sender, EventArgs e)
        {
            try
            {
                SCMPerdida perd = new SCMPerdida(0, int.Parse(txtID.Text)
                    , int.Parse(txtCant.Text), dtpFecha.Value, txtMotivo.Text);
                if (perd.insertar())
                {
                    GLOMensajeAceptar mensaje = new GLOMensajeAceptar("La pérdida ya fue registrada en el sistema");
                    mensaje.ShowDialog();
                    cargarListaPerdidas();
                    btnCancelar.PerformClick();
                }
            }
            catch (FormatException fe)
            {
                GLOMensajeError error = new GLOMensajeError("Error de validación.", "Mensaje técnico del error: " + fe.Message, "FormatException");
                error.ShowDialog();
            }
            catch (NullReferenceException ne) {
                GLOMensajeError error = new GLOMensajeError("Error de validación", "Debe escoger el producto que tuvo pérdidas.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                error.ShowDialog();
            }
        }

        private void lstPerdidas_SelectedIndexChanged(object sender, EventArgs e)
        {
            cargarDatosPerdida();
        }

        private void btnEliminar_Click(object sender, EventArgs e)
        {
            if (MessageBox.Show("ADVERTENCIA: Posible corrupción en los datos.\n\nUsted está por borrar un registro de pérdida. "
                + "El sistema permite borrarlos en caso de haber puesto los datos mal. "
                + "Al borrar este registro el inventario aumentara, ya que se repondrá \"lo que no se perdió\"."
                + " Si el inventario tiene excedentes deberá entonces registrar la pérdida correcta.\n\n"
                + "¿Desea borrar esta pérdida?", "Borrar Pérdida", MessageBoxButtons.YesNo) == DialogResult.Yes)
            {
                try
                {
                    //Vamos a borrar...
                    DataRowView dr = (DataRowView)(lstPerdidas.SelectedItem);
                    SCMPerdida perd = new SCMPerdida();
                    perd.IdPerdida = int.Parse(dr["IdPerdida"].ToString());
                    perd.IdProducto = int.Parse(dr["IdProducto"].ToString());
                    perd.Cantidad = int.Parse(dr["Cantidad"].ToString());
                    if (perd.eliminar())
                    {
                        GLOMensajeAceptar mensaje = new GLOMensajeAceptar("Se ha eliminado el registro");
                        mensaje.ShowDialog();
                        txtMotivo.Text = "";
                        txtCant.Text = "";
                        txtTotalPerdido.Text = "";
                        cargarDetallesPerdida();
                        cargarListaPerdidas();
                        cargarDatosPerdida();
                    }
                    else
                    {
                        GLOMensajeError error = new GLOMensajeError("Error grave al conectar con la base de datos.", "Este error puede deberse a que se haya perdido la conexión con la base de datos o ocurriera un error en el sistema.\n\n Mensaje técnico del error: " + Cache.ErrorActual, "SqlException");
                        error.ShowDialog();
                    }
                }
                catch (NullReferenceException ne) {
                    GLOMensajeError error = new GLOMensajeError("Error de validación", "No ha escogido el registro de pérdida que desea borrar.\n\n Mensaje técnico del error: " + ne.Message, "NullReferenceException");
                    error.ShowDialog();
                }
            }
        }

        private void btnBuscarProd_Click(object sender, EventArgs e)
        {
            buscador = new GLOBuscador();
            buscador.Entidad = (int)GLOBuscador.Entidades.PerdProd;
            buscador.FormClosed += new FormClosedEventHandler(buscadorProd_Closed);
            buscador.ShowDialog();
        }

        private void buscadorProd_Closed(object sender, FormClosedEventArgs e)
        {
            try
            {
                txtID.Text = Cache.perproducto.Cells[0].Value.ToString();
                txtProducto.Text = Cache.perproducto.Cells[2].Value.ToString();
                cargarDetallesPerdida();
            }
            catch (NullReferenceException) { }
        }

        private void dtpFecha2_ValueChanged(object sender, EventArgs e)
        {
            txtMotivo.Text = "";
            txtCant.Text = "";
            txtTotalPerdido.Text = "";
            cargarDetallesPerdida();
            cargarListaPerdidas();
            cargarDatosPerdida();
        }
    }
}
